{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# 激活函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "59b2e6c202686d91"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-01-12T01:34:06.717623600Z",
     "start_time": "2024-01-12T01:34:01.368785900Z"
    }
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import keras\n",
    "from keras import layers"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## sigmoid函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "d38f846d99917b7d"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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y5PW4RdffCE0Go1YtWqVyM7OFnPmzBG+vr7izJkzQggh5s2bJ6ZOnWobn5OTI3x8fMTcuXNFdna2WLVqldBoNOLLL7+UqoVmPfXUUyIgIEBs27at0bqqqamxjbm+v7ffflts2rRJnDhxQvz6669i3rx5AoDYsGGDFC206vnnnxfbtm0TOTk54ocffhD33HOP8PPzk8X6a2A2m0VsbKz43//93ybPedr6q6qqsv07B8D2eXn27FkhRNs+C6dOndrobLfdu3cLlUolXn/9dXH06FHx+uuvC7VaLX744QeX1S37MDJ9+nQBoMnX1q1bbWPOnj0rJk6cKLy9vUVwcLCYPXu2qK2ttT2fm5vbZJ4rV66I2bNni+DgYOHt7S3uuecekZeX14mdNe+RRx4RI0aMaPZ5AGLNmjVCCCFqampESkqKCAsLExqNRsTGxorp06e7TS/XO3DggLj11ltFQECA8PLyEgkJCeKVV14R1dXVjcZd26MQ1lPaXnnlFREZGSl0Op247bbbxOHDhzu5+tatWbPG7vv1+v83eNo6fO+990RcXJzQarXipptuanTq6/Tp08WYMWMajd+2bZsYOnSo0Gq1omfPnmL58uWdXHHbNLeurn3vXd/fG2+8IXr37i28vLxEUFCQGDVqlPj22287v/g2mjJlioiKihIajUZER0eL3/zmN+LIkSO25z15/TXYvHmzACCOHz/e5DlPW38Npx5f/zV9+nQhRNs+C8eMGWMb32D9+vUiISFBaDQa0b9/f5eHL4UQ9UcWEREREUmgy5/aS0RERNJiGCEiIiJJMYwQERGRpBhGiIiISFIMI0RERCQphhEiIiKSFMMIERERSYphhIiIiCTFMEJERESSYhghIiIiSTGMEBERkaQYRoiIiEhS/w9viO2SHlEpuwAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-10, 10, 1000)\n",
    "y = tf.nn.sigmoid(x)\n",
    "plt.plot(x, y)\n",
    "plt.grid()\n",
    "# 在区间值0~1区间，以0.5为中心（均值0.5），实际应用中，比较少用这个函数,一般用于二分类的输出层"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T12:22:50.368329600Z",
     "start_time": "2024-01-10T12:22:50.091493600Z"
    }
   },
   "id": "8569f980db39eec5"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## tanh激活函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "cef2daaa3884eeb0"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-10, 10, 1000)\n",
    "y = tf.nn.tanh(x)\n",
    "plt.plot(x, y)\n",
    "plt.grid()\n",
    "# 在区间值0~1区间，以0为中心（均值0.5），比sigmoid快一些，主要用在隐藏层中"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T12:32:52.997811900Z",
     "start_time": "2024-01-10T12:32:52.740261600Z"
    }
   },
   "id": "f5093da51267e036"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## relu激活函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "c4a37f5cc380f2f2"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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t99+W88///w57xuIa/jRRx9pyJAheuGFF7RmzRpdddVV6tu3r/bs2VPl/jt37tSNN96oq666SmvWrNHzzz+vJ554QrNmzfJz5dWzZMkSDR48WCtWrFBmZqZKS0uVkZGhwsLCc9538+bNp6xX69at/VBxzXXs2PGUOteuXXvGfYNt/SRp5cqVp/SXmZkpSRo4cOBZ7xeo61dYWKj09HS9+eabVd5+Ps+Hy5cv11133aX7779fWVlZuv/++3XnnXfq+++/917hxoamTZtm4uLiTts+f/58Exoaavbv31+57cMPPzROp9Pk5eVVeazjx48bh8NhZsyYUblt//79JjQ01Hz55Zder/1ClJSUmMaNG5tXXnnlrPsNGjTIDBgwwD9FXaDmzZubN954o9r7ezwek5iYaMaPH1+5rbi42MTFxZm3337bBxV638SJE01qaupZ9wnUNbz00kvNI488csq2du3ameHDh1e5/7PPPmvatWt3yraHH37YXH755T6r0Ztyc3ONJLNkyZIz7rNo0SIjyRw7dsx/hZ2nkSNHmvT09GrvH+zrZ4wxTz75pGnVqpXxeDxV3h5M6yfJzJkzp/Lr830+vPPOO80NN9xwyrY+ffqYu+++22u12uqVj3NZvny50tLSlJycXLmtT58+crlcWr16dZX3Wb16tdxutzIyMiq3JScnKy0tTcuWLfN5zTUxb948HT58WH/4wx/Oue/ixYvVuHFjtWnTRg899JByc3N9X+B5mjBhgho2bKguXbpozJgxZx1J7Ny5Uzk5Oaesl9Pp1DXXXBNw63UmeXl5atCgwTn3C7Q1LCkp0erVq0/53ktSRkbGGb/3y5cvP23/Pn36aNWqVXK73T6r1Vvy8vIkqVrrdfHFFyspKUnXXXedFi1a5OvSztvWrVuVnJys1NRU3X333dqxY8cZ9w329SspKdE//vEP/fGPfzznhUyDZf1+7XyfD8+0rt58Dq1V4SMnJ0cJCQmnbKtfv74iIiKUk5NzxvtERESofv36p2xPSEg4432s8v7776tPnz5KSUk56359+/bVP//5T3399dd6/fXXtXLlSl177bVyuVx+qrT6nnzySc2YMUOLFi3SY489pqlTp+rRRx894/4Va/LbdQ7E9arK9u3b9Ze//EWPPPLIWfcLxDU8fPiwysrKavS9r+rfZEJCgkpLS3X48GGf1eoN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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-10, 10, 1000)\n",
    "y = tf.nn.relu(x)\n",
    "plt.plot(x, y)\n",
    "plt.grid()\n",
    "# ReLU是目前最常用的激活函数。从图中可以看到，当x<0时，ReLU导数为0，而当x>0时，则不存在饱和问题。所以，ReLU 能够在x>0时保持梯度不衰减，从而缓解梯度消失问题。然而，随着训练的推进，部分输入会落入小于0区域，导致对应权重无法更新。这种现象被称为“神经元死亡\""
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T12:35:49.959642400Z",
     "start_time": "2024-01-10T12:35:49.681432600Z"
    }
   },
   "id": "ce67f962a262164c"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## LeakRelu激活函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "aa30701ca8a5f0c1"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-10, 10, 1000)\n",
    "y = tf.nn.leaky_relu(x)\n",
    "plt.plot(x, y)\n",
    "plt.grid()\n",
    "# 对relu改进 f(x)=max(0.1x,x)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T12:43:04.679310200Z",
     "start_time": "2024-01-10T12:43:04.421070300Z"
    }
   },
   "id": "6a3eee09da688651"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## SoftMax激活函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "f4ef7720511c69e5"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[0.02167152 0.01810158 0.02061459 0.06510484 0.02925349 0.01884031\n",
      " 0.05330333 0.01865285 0.75445753], shape=(9,), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "x = tf.constant([0.2, 0.02, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])\n",
    "y = tf.nn.softmax(x)\n",
    "print(y)\n",
    "# plt.plot(x,y)\n",
    "# plt.grid()\n",
    "\n",
    "# 用在多分类上。softmax直白来说就是将网络输出的logits通过softmax函数，就映射成为(0,1)的值，而这些值的累和为1(满足概率的性质)，那么我们将它理解成概率，选取概率最大 (也就是值对应最大的)接点，作为我们的预测目标类别。"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T12:53:25.194739500Z",
     "start_time": "2024-01-10T12:53:25.137157500Z"
    }
   },
   "id": "d24425f8336b59d6"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 参数初始化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "a933d56902464a79"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Xavier初始化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "e9452cb8c513d66e"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 正态分布"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "7257cb166da66d1"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[-0.13231862]\n",
      " [ 0.52952224]\n",
      " [-0.22421044]\n",
      " [-0.07700519]\n",
      " [-0.03643549]\n",
      " [ 0.59671   ]\n",
      " [-0.4375243 ]\n",
      " [ 0.5884597 ]\n",
      " [ 0.04744913]], shape=(9, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "init = tf.keras.initializers.glorot_normal()\n",
    "values = init(shape=(9, 1))\n",
    "print(values)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:12:03.985230800Z",
     "start_time": "2024-01-10T13:12:03.915468Z"
    }
   },
   "id": "2b53dfe11a8f8416"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 均匀分布"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "9e23729a05e422b1"
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[-0.73668134]\n",
      " [ 0.24798429]\n",
      " [-0.00741929]\n",
      " [ 0.32193756]\n",
      " [-0.67603505]\n",
      " [ 0.2897544 ]\n",
      " [-0.03811115]\n",
      " [ 0.67823434]\n",
      " [ 0.03058749]], shape=(9, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "init = tf.keras.initializers.glorot_uniform()\n",
    "values = init(shape=(9, 1))\n",
    "print(values)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:12:54.585903400Z",
     "start_time": "2024-01-10T13:12:54.505397300Z"
    }
   },
   "id": "69579004e99d2295"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## HE初始化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "703241d0cb3fa289"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 正态分布"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "3c7f8a9a58e05248"
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[ 0.10669721]\n",
      " [-0.57032263]\n",
      " [ 0.32106543]\n",
      " [-0.12596509]\n",
      " [-0.5975471 ]\n",
      " [-0.05589787]\n",
      " [-0.25383875]\n",
      " [ 0.35541826]\n",
      " [-0.6089424 ]], shape=(9, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "init = tf.keras.initializers.he_normal()\n",
    "values = init(shape=(9, 1))\n",
    "print(values)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:19:32.365887700Z",
     "start_time": "2024-01-10T13:19:32.335828200Z"
    }
   },
   "id": "c053922368828831"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 均匀分布"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "547f6d878ea14bf5"
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[ 0.66313326]\n",
      " [ 0.21004581]\n",
      " [-0.6975578 ]\n",
      " [ 0.11629248]\n",
      " [-0.20087147]\n",
      " [ 0.54762626]\n",
      " [ 0.04706585]\n",
      " [ 0.72244453]\n",
      " [ 0.09906441]], shape=(9, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "init = tf.keras.initializers.he_uniform()\n",
    "values = init(shape=(9, 1))\n",
    "print(values)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:19:30.525076800Z",
     "start_time": "2024-01-10T13:19:30.462113300Z"
    }
   },
   "id": "1468a23b69cbf7fd"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 神经网络搭建"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "9046ebcec09dafb9"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## sequential方式"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "adaf753c119f884f"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 构建模型"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "911b0b62824bdcb7"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [],
   "source": [
    "model = keras.Sequential([\n",
    "    # 第一个隐藏层\n",
    "    layers.Dense(3,\n",
    "                 activation=\"relu\",\n",
    "                 kernel_initializer=\"he_normal\",\n",
    "                 name=\"L1\",\n",
    "                 input_shape=(3, 0)),\n",
    "    # 第二个隐藏层\n",
    "    layers.Dense(2,\n",
    "                 activation=\"relu\",\n",
    "                 kernel_initializer=\"he_normal\",\n",
    "                 name=\"L2\"),\n",
    "    # 输出\n",
    "    layers.Dense(2,\n",
    "                 activation=\"relu\",\n",
    "                 kernel_initializer=\"he_normal\",\n",
    "                 name=\"L3\")\n",
    "\n",
    "], name=\"第一个模型\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:41:09.121266100Z",
     "start_time": "2024-01-10T13:41:08.963254600Z"
    }
   },
   "id": "ae50bf9886d4c409"
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"第一个模型\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " L1 (Dense)                  (None, 3, 3)              3         \n",
      "                                                                 \n",
      " L2 (Dense)                  (None, 3, 2)              8         \n",
      "                                                                 \n",
      " L3 (Dense)                  (None, 3, 2)              6         \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 17\n",
      "Trainable params: 17\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:41:44.974337400Z",
     "start_time": "2024-01-10T13:41:44.876355900Z"
    }
   },
   "id": "f7cf3f8033599977"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "from keras import utils"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T02:48:06.060558500Z",
     "start_time": "2024-01-11T02:48:06.034573500Z"
    }
   },
   "id": "54447aae7ef06861"
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": "<IPython.core.display.Image object>"
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "utils.plot_model(model)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-10T13:43:00.675559900Z",
     "start_time": "2024-01-10T13:43:00.387797200Z"
    }
   },
   "id": "68b45772f6da6c44"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 利用funtion api构建模型"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "2495a669769ec7b3"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"API Function Model\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " input (InputLayer)          [(None, 3)]               0         \n",
      "                                                                 \n",
      " layer1 (Dense)              (None, 3)                 12        \n",
      "                                                                 \n",
      " layer2 (Dense)              (None, 2)                 8         \n",
      "                                                                 \n",
      " outputs (Dense)             (None, 2)                 6         \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 26\n",
      "Trainable params: 26\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# 定义模型输入\n",
    "inputs = keras.Input(shape=(3,), name=\"input\")\n",
    "# 第一个隐藏层\n",
    "x = layers.Dense(3, activation=\"relu\", name=\"layer1\")(inputs)\n",
    "# 第二个隐藏层\n",
    "x = layers.Dense(2, activation=\"relu\", name=\"layer2\")(x)\n",
    "# 输出层\n",
    "outputs = layers.Dense(2, activation=\"sigmoid\", name=\"outputs\")(x)\n",
    "# 创建模型\n",
    "model = keras.Model(inputs=inputs, outputs=outputs, name=\"API Function Model\")\n",
    "\n",
    "model.summary()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T02:48:09.607016100Z",
     "start_time": "2024-01-11T02:48:09.373135800Z"
    }
   },
   "id": "dd7f3ad63e29afd"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": "<IPython.core.display.Image object>"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "utils.plot_model(model, show_shapes=True, show_layer_activations=True)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T02:49:35.212725800Z",
     "start_time": "2024-01-11T02:49:34.539911Z"
    }
   },
   "id": "b307656f33c9d1f1"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 通过model子类构建模型"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "7ebc4178e7d81d0d"
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [],
   "source": [
    "class myModel(keras.Model):\n",
    "    # 定义网络层结构\n",
    "    def __int__(self):\n",
    "        super(myModel, self).__init__()\n",
    "        # 隐藏层1\n",
    "        self.layer1 = layers.Dense(3, activation=\"relu\", name=\"layer1\")\n",
    "        # 隐藏层2\n",
    "        self.layer2 = layers.Dense(2, activation=\"relu\", name=\"layer2\")\n",
    "        # 输出层\n",
    "        self.layer3 = layers.Dense(2, activation=\"sigmoid\", name=\"layer3\")\n",
    "\n",
    "    # 定义网络的前向传播\n",
    "    def call(self, inp):\n",
    "        x = self.layer1(inp)\n",
    "        x = self.layer2(x)\n",
    "        return self.layer3(x)\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T03:33:52.588726200Z",
     "start_time": "2024-01-11T03:33:52.553595500Z"
    }
   },
   "id": "e3496c5e539499e3"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "Exception encountered when calling layer \"my_model_5\" \"                 f\"(type myModel).\n\n'myModel' object has no attribute 'layer1'\n\nCall arguments received by layer \"my_model_5\" \"                 f\"(type myModel):\n  • inp=tf.Tensor(shape=(1, 3), dtype=float32)",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mAttributeError\u001B[0m                            Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[17], line 3\u001B[0m\n\u001B[0;32m      1\u001B[0m model \u001B[38;5;241m=\u001B[39m myModel()\n\u001B[0;32m      2\u001B[0m x \u001B[38;5;241m=\u001B[39m tf\u001B[38;5;241m.\u001B[39mones((\u001B[38;5;241m1\u001B[39m, \u001B[38;5;241m3\u001B[39m))\n\u001B[1;32m----> 3\u001B[0m y \u001B[38;5;241m=\u001B[39m \u001B[43mmodel\u001B[49m\u001B[43m(\u001B[49m\u001B[43mx\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mF:\\ProgramData\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\keras\\utils\\traceback_utils.py:70\u001B[0m, in \u001B[0;36mfilter_traceback.<locals>.error_handler\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m     67\u001B[0m     filtered_tb \u001B[38;5;241m=\u001B[39m _process_traceback_frames(e\u001B[38;5;241m.\u001B[39m__traceback__)\n\u001B[0;32m     68\u001B[0m     \u001B[38;5;66;03m# To get the full stack trace, call:\u001B[39;00m\n\u001B[0;32m     69\u001B[0m     \u001B[38;5;66;03m# `tf.debugging.disable_traceback_filtering()`\u001B[39;00m\n\u001B[1;32m---> 70\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m e\u001B[38;5;241m.\u001B[39mwith_traceback(filtered_tb) \u001B[38;5;28;01mfrom\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m     71\u001B[0m \u001B[38;5;28;01mfinally\u001B[39;00m:\n\u001B[0;32m     72\u001B[0m     \u001B[38;5;28;01mdel\u001B[39;00m filtered_tb\n",
      "Cell \u001B[1;32mIn[15], line 14\u001B[0m, in \u001B[0;36mmyModel.call\u001B[1;34m(self, inp)\u001B[0m\n\u001B[0;32m     13\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mcall\u001B[39m(\u001B[38;5;28mself\u001B[39m, inp):\n\u001B[1;32m---> 14\u001B[0m     x \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mlayer1\u001B[49m(inp)\n\u001B[0;32m     15\u001B[0m     x \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mlayer2(x)\n\u001B[0;32m     16\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mlayer3(x)\n",
      "\u001B[1;31mAttributeError\u001B[0m: Exception encountered when calling layer \"my_model_5\" \"                 f\"(type myModel).\n\n'myModel' object has no attribute 'layer1'\n\nCall arguments received by layer \"my_model_5\" \"                 f\"(type myModel):\n  • inp=tf.Tensor(shape=(1, 3), dtype=float32)"
     ]
    }
   ],
   "source": [
    "model = myModel()\n",
    "x = tf.ones((1, 3))\n",
    "y = model(x)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T03:33:57.813134700Z",
     "start_time": "2024-01-11T03:33:57.736180Z"
    }
   },
   "id": "1c695ccf8771d14d"
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNameError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[18], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m \u001B[43my\u001B[49m\n",
      "\u001B[1;31mNameError\u001B[0m: name 'y' is not defined"
     ]
    }
   ],
   "source": [
    "y"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T03:34:15.040293800Z",
     "start_time": "2024-01-11T03:34:14.974348900Z"
    }
   },
   "id": "6f1f2933c1c35391"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 损失函数"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "b2aaea4d6ac50dfe"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 交叉熵损失"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "f058666fcf96273a"
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Tensor: shape=(), dtype=float32, numpy=0.39925388>"
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置真实值和预测值\n",
    "y_true = [[0, 1, 0], [0, 0, 1]]\n",
    "y_pre = [[0.05, 0.9, 0.05], [0.3, 0.2, 0.5]]\n",
    "# 实例化交叉熵损失\n",
    "cce = tf.losses.CategoricalCrossentropy()\n",
    "cce(y_true, y_pre)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:06:46.523146Z",
     "start_time": "2024-01-11T05:06:46.470183600Z"
    }
   },
   "id": "eaa5a85cdded88e9"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 二分类交叉熵损失"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "500307d9d71651e0"
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Tensor: shape=(), dtype=float32, numpy=0.5108254>"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置真实值和预测值\n",
    "y_true = [[0], [1]]\n",
    "y_pre = [[0.4], [0.6]]\n",
    "# 实例化二分类交叉熵损失\n",
    "bc = tf.losses.BinaryCrossentropy()\n",
    "bc(y_true, y_pre)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:09:12.793232700Z",
     "start_time": "2024-01-11T05:09:12.737724500Z"
    }
   },
   "id": "50c999156f766ff0"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## MAE损失(L1 Loss)"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "e0a2f51227961956"
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [
    {
     "data": {
      "text/plain": "1.0"
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置真实值和预测值\n",
    "y_true = [[0.], [1.]]\n",
    "y_pre = [[1.], [0.]]\n",
    "# 实例化二分类交叉熵损失\n",
    "mae = tf.losses.MeanAbsoluteError()\n",
    "mae(y_true, y_pre).numpy()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:14:20.596629600Z",
     "start_time": "2024-01-11T05:14:20.542095Z"
    }
   },
   "id": "b04a341a83388a39"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## MSE损失(L2 Loss)"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "48480087494a5fea"
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [
    {
     "data": {
      "text/plain": "0.625"
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置真实值和预测值\n",
    "y_true = [[0.], [1.]]\n",
    "y_pre = [[0.5], [0.]]\n",
    "# 实例化二分类交叉熵损失\n",
    "mse = tf.losses.MeanSquaredError()\n",
    "mse(y_true, y_pre).numpy()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:16:30.124392400Z",
     "start_time": "2024-01-11T05:16:30.050154800Z"
    }
   },
   "id": "64ca36fa071d2c05"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## smooth 平滑L1损失"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "31a01bec3d6f6aaa"
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "outputs": [
    {
     "data": {
      "text/plain": "0.24249998"
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置真实值和预测值\n",
    "y_true = [[0.], [1.]]\n",
    "y_pre = [[0.9], [0.6]]\n",
    "# 实例化二分类交叉熵损失\n",
    "hub = tf.losses.Huber()\n",
    "hub(y_true, y_pre).numpy()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:18:10.572602200Z",
     "start_time": "2024-01-11T05:18:10.546483900Z"
    }
   },
   "id": "23cfcb2cf5a91635"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 深度学习优化-梯度下降法"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "37a6d3391a0f0070"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## SGD 随机梯度下降法"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "76c548d59eecd5e6"
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.9>"
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 实例化SGD\n",
    "opt = tf.optimizers.SGD(learning_rate=0.1)\n",
    "# 定义要更新的参数\n",
    "v = tf.Variable(1.0)\n",
    "# 定义损失函数\n",
    "loss = lambda: (v ** 2) / 2.0\n",
    "# 计算损失梯度，并进行参数更新\n",
    "opt.minimize(loss, [v]).numpy()  # opt.minimize(loss,[v]).numpy # 结果一样\n",
    "v\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-11T05:27:57.204490200Z",
     "start_time": "2024-01-11T05:27:57.036904700Z"
    }
   },
   "id": "49656bc6d842957b"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Monentum算法优化SGD"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "b701b8787262280d"
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初始值=1.0\n"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "minimize() missing 1 required positional argument: 'var_list'",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mTypeError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[16], line 10\u001B[0m\n\u001B[0;32m      8\u001B[0m loss \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mlambda\u001B[39;00m: (var \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39m \u001B[38;5;241m2\u001B[39m) \u001B[38;5;241m/\u001B[39m \u001B[38;5;241m2.0\u001B[39m\n\u001B[0;32m      9\u001B[0m \u001B[38;5;66;03m# 第一次更新\u001B[39;00m\n\u001B[1;32m---> 10\u001B[0m \u001B[43mopt\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mminimize\u001B[49m\u001B[43m(\u001B[49m\u001B[43m(\u001B[49m\u001B[43mloss\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m[\u001B[49m\u001B[43mvar\u001B[49m\u001B[43m]\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241m.\u001B[39mnumpy()\n\u001B[0;32m     11\u001B[0m v1 \u001B[38;5;241m=\u001B[39m var\u001B[38;5;241m.\u001B[39mvalue()\n\u001B[0;32m     12\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m第一次更新=\u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(v1))\n",
      "\u001B[1;31mTypeError\u001B[0m: minimize() missing 1 required positional argument: 'var_list'"
     ]
    }
   ],
   "source": [
    "# 实例化\n",
    "opt = tf.optimizers.SGD(learning_rate=0.1, momentum=0.9)\n",
    "# 定义更新参数\n",
    "var = tf.Variable(1.0)\n",
    "v0 = var.value()\n",
    "print(\"初始值={}\".format(v0))\n",
    "# 定义损失函数\n",
    "loss = lambda: (var ** 2) / 2.0\n",
    "# 第一次更新\n",
    "opt.minimize((loss, [var])).numpy()\n",
    "v1 = var.value()\n",
    "print(\"第一次更新={}\".format(v1))\n",
    "\n",
    "# 第二次更新\n",
    "opt.minimize((loss, [var])).numpy()\n",
    "v2 = var.value()\n",
    "print(\"第二次更新={}\".format(v2))\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T02:00:12.057609900Z",
     "start_time": "2024-01-12T02:00:11.980657600Z"
    }
   },
   "id": "25a4d4d4afbbacd0"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### AdaGrad优化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "21a0205ce59c70c5"
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.90465385>"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "opt = tf.optimizers.Adagrad(learning_rate=0.1,\n",
    "                      initial_accumulator_value=0.1,\n",
    "                      epsilon=1e-06)\n",
    "#定义更新的参数\n",
    "var = tf.Variable(1.0)\n",
    "#定义损失函数\n",
    "def lossFun():\n",
    "    return (var**2)/2.0\n",
    "#进行更新\n",
    "opt.minimize(lossFun,[var]).numpy()\n",
    "var"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T01:59:02.334518400Z",
     "start_time": "2024-01-12T01:59:02.222576200Z"
    }
   },
   "id": "398b9a12df8c5c5a"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### RMSprop"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "59615f55e45d5d7c"
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.89459074>"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "opt = tf.optimizers.RMSprop(learning_rate=0.1,rho=0.1)\n",
    "#定义要调整的参数\n",
    "var = tf.Variable(1.0)\n",
    "#定义损失函数\n",
    "def loss():return (var**2)/2.0\n",
    "#计算梯度，并对参数进行更新\n",
    "opt.minimize(loss,[var]).numpy()\n",
    "var\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T02:00:51.163841800Z",
     "start_time": "2024-01-12T02:00:51.070987700Z"
    }
   },
   "id": "610ea6d9f673f75"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Adam 一般用这个就可以"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "d36b8b957e2a8baf"
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.90000033>"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "opt = tf.optimizers.Adam(learning_rate=0.1)\n",
    "#定义要调整的参数\n",
    "var = tf.Variable(1.0)\n",
    "#定义损失函数\n",
    "def loss():return (var**2)/2.0\n",
    "#计算梯度，并对参数进行更新\n",
    "opt.minimize(loss,[var]).numpy()\n",
    "var\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T02:04:19.989916300Z",
     "start_time": "2024-01-12T02:04:19.899540700Z"
    }
   },
   "id": "3d282e804b6ff0e2"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 正则化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "6284aa8a62f61a9c"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## dropout"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "5fc80f9323b3b992"
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.  2.]\n",
      " [ 3.  4.]\n",
      " [ 5.  6.]\n",
      " [ 7.  8.]\n",
      " [ 9. 10.]]\n",
      "tf.Tensor(\n",
      "[[ 1.25  0.  ]\n",
      " [ 3.75  5.  ]\n",
      " [ 6.25  7.5 ]\n",
      " [ 8.75 10.  ]\n",
      " [ 0.   12.5 ]], shape=(5, 2), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "# 定义dropout层，每个神经元有0.2的概率呗失活，未被失活的输入将按1/(1-rate)放大\n",
    "layer = keras.layers.Dropout(0.2,input_shape=(2,))\n",
    "# 定义5个批次的数据\n",
    "data = np.arange(1,11).reshape(5,2).astype(np.float32)\n",
    "print(data)\n",
    "# 进行随机失活：在training模块中，发挥应用dropout的输出，或者在非training模式下，正常返回输出\n",
    "outputs = layer(data,training=True)\n",
    "print(outputs)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T02:29:24.036889400Z",
     "start_time": "2024-01-12T02:29:23.972918900Z"
    }
   },
   "id": "b2137c5e7e7c17b4"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Early Stopping"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "4c167013c23b642a"
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "5/5 [==============================] - 0s 3ms/step - loss: 1372604477592305664.0000\n",
      "Epoch 2/10\n",
      "5/5 [==============================] - 0s 2ms/step - loss: 6771387175906433714206046307745792.0000\n",
      "Epoch 3/10\n",
      "5/5 [==============================] - 0s 2ms/step - loss: inf\n",
      "Epoch 4/10\n",
      "5/5 [==============================] - 0s 2ms/step - loss: inf\n"
     ]
    },
    {
     "data": {
      "text/plain": "4"
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 连续3个ecpoch loss不下降则停止训练\n",
    "cb = tf.keras.callbacks.EarlyStopping(monitor=\"loss\",patience=3)\n",
    "# 只有一层的神经网络\n",
    "model = keras.models.Sequential([keras.layers.Dense(10)])\n",
    "# 设置损失函数和梯度下降法\n",
    "model.compile(keras.optimizers.SGD(),loss=\"mse\")\n",
    "arr1=np.arange(100).reshape(5,20)\n",
    "arr2=np.array([0,1,2,1,2])\n",
    "# 模型训练\n",
    "history = model.fit(arr1,arr2,\n",
    "          epochs=10,\n",
    "          batch_size=1,\n",
    "          callbacks=[cb],\n",
    "          verbose=1)\n",
    "len(history.history[\"loss\"])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-01-12T02:41:45.510537900Z",
     "start_time": "2024-01-12T02:41:44.849332600Z"
    }
   },
   "id": "c4e0e95180dd89d9"
  },
  {
   "cell_type": "markdown",
   "source": [
    "### BN层，针对某一批次的数据的神经元的输出进行标准化"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "a12270d1b7a02d1e"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# epsilon:防止分母为0\n",
    "# center:如果为True，则将的偏移beta量添加到标准化张量。如果为False，则将beta 被忽略\n",
    "# scale:如果为True，则乘以gamma。如果为False，gamma则不使用\n",
    "# beta_initializer:Beta权重的初始化程序\n",
    "# gamma_initializer:伽玛权重的初始化程序\n",
    "keras.layers.BatchNormalization(\n",
    "    epsilon=0.1,\n",
    "    center=True,\n",
    "    scale=True,\n",
    "    beta_initializer='zeros',\n",
    "    gamma_initializer='ones'\n",
    ")"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "4c643ac8560b79b4"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "815f99caf4e87731"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "f2caf4e004cdcde2"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "37d0328c38a063d8"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "dd2fdbaab86ff657"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "8678618e45038e44"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
